package common

import "errors"

// 错误码常量
const (
	ErrInvalidParam = "INVALID_PARAM"    // 无效参数
	ErrUnauthorized = "UNAUTHORIZED"     // 未授权
	ErrForbidden    = "FORBIDDEN"        // 禁止访问
	ErrNotFound     = "NOT_FOUND"        // 资源不存在
	ErrInternal     = "INTERNAL_ERROR"   // 内部错误
	ErrBadRequest   = "BAD_REQUEST"      // 错误的请求
	ErrValidation   = "VALIDATION_ERROR" // 验证错误
	ErrDuplicate    = "DUPLICATE_RECORD" // 记录重复
	ErrDatabase     = "DATABASE_ERROR"   // 数据库错误
)

var (
	// 兼容旧代码的错误变量
	ErrInvalidParams   = errors.New("参数无效")
	ErrUnauthorizedOld = errors.New("未授权")
	ErrForbiddenOld    = errors.New("无权限")
	ErrNotFoundOld     = errors.New("未找到")
	ErrServerError     = errors.New("服务器错误")
)

// ApiError 定义API错误结构
type ApiError struct {
	Code    string `json:"code"`    // 错误码
	Message string `json:"message"` // 错误消息
}

// Error 实现error接口
func (e *ApiError) Error() string {
	return e.Message
}

// NewError 创建新的API错误
func NewError(code string, message string) *ApiError {
	return &ApiError{
		Code:    code,
		Message: message,
	}
}

// IsNotFound 判断是否为资源不存在错误
func IsNotFound(err error) bool {
	if err == nil {
		return false
	}

	if apiErr, ok := err.(*ApiError); ok {
		return apiErr.Code == ErrNotFound
	}

	return err.Error() == "未找到" || err.Error() == "not found" || errors.Is(err, ErrNotFoundOld)
}

// IsInvalidParam 判断是否为无效参数错误
func IsInvalidParam(err error) bool {
	if err == nil {
		return false
	}

	if apiErr, ok := err.(*ApiError); ok {
		return apiErr.Code == ErrInvalidParam
	}

	return err.Error() == "参数无效" || errors.Is(err, ErrInvalidParams)
}

// IsDuplicateRecord 判断是否为记录重复错误
func IsDuplicateRecord(err error) bool {
	if err == nil {
		return false
	}

	if apiErr, ok := err.(*ApiError); ok {
		return apiErr.Code == ErrDuplicate
	}

	return err.Error() == "记录已存在" || err.Error() == "duplicate record"
}
